<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:c="livcos.org/ns/cosmos"
  xmlns:u="livcos.org/ns/cosmos/update"
  xmlns="livcos.org/ns/doc"
  exclude-result-prefixes="c">

  <xsl:param name="objId"/>
  <xsl:param name="scope"/>
  <xsl:param name="id"/>
  <xsl:param name="path" select="'.'" />
  <xsl:param name="view"/>
	
  <xsl:variable name="idPath">
    <xsl:choose>
      <xsl:when test="(normalize-space($id) = '') or ($id = $objId)">
        <!-- take the root entity -->
        <xsl:text>.</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text>.//*[@id = '</xsl:text>
        <xsl:value-of select="$id" />
        <xsl:text>']</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <xsl:template match="/*">
    <u:context ref="{$objId}" scope="{$scope}">
      <u:context select="{$idPath}">
        <xsl:apply-templates select="c:request/parameter/*" />
      </u:context>
    </u:context>
    <job:feed xmlns:job="livcos.org/ns/process/job" ref="{$view}" stream="response" base="job"/>
  </xsl:template>
  
	<xsl:template match="*">
	</xsl:template>
	
	<xsl:template match="@* | node()" mode="content" priority="-1">
		<xsl:copy><xsl:apply-templates select="@* | node()" mode="content"/></xsl:copy>
	</xsl:template>
	
	<xsl:template match="text()" mode="content">
		<xsl:value-of select="." disable-output-escaping="yes"/>
	</xsl:template>
	
  <xsl:template match="*" mode="content">
    <xsl:apply-templates select="node()" mode="content"/>
  </xsl:template>
  
  <xsl:template match="u | br | code | sup | sub" mode="content">
    <xsl:element name="{lower-case(local-name(.))}">
      <xsl:apply-templates select="node()" mode="content"/>
    </xsl:element>
  </xsl:template>
  
  <xsl:template match="br[not(following-sibling::node())]" mode="content">
  </xsl:template>
  
  <xsl:template match="b | strong" mode="content">
    <strong>
      <xsl:apply-templates select="node()" mode="content"/>
    </strong>
  </xsl:template>
  
  <xsl:template match="i | em" mode="content">
    <em>
      <xsl:apply-templates select="node()" mode="content"/>
    </em>
  </xsl:template>
  
  <xsl:template match="s | strike" mode="content">
    <s>
      <xsl:apply-templates select="node()" mode="content"/>
    </s>
  </xsl:template>
  
  <xsl:template match="A | a" mode="content">
    <link xmlns="livcos.org/ns/doc">
      <xsl:attribute name="id">
        <xsl:choose>
          <xsl:when test="normalize-space(@id) != ''">
            <xsl:value-of select="@id"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:text>{new-id()}</xsl:text>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:attribute>
      <xsl:choose>
        <xsl:when test="normalize-space(@href) = ''">
        </xsl:when>
        <xsl:when test="not(contains(@href, '://'))">
          <xsl:attribute name="ref">
            <xsl:value-of select="@href"/>
          </xsl:attribute>
        </xsl:when>
        <xsl:when test="starts-with(@href, 'cosmos://')">
          <xsl:attribute name="ref">
            <xsl:value-of select="substring-after(@href, 'cosmos://')"/>
          </xsl:attribute>
        </xsl:when>
        <xsl:otherwise>
          <xsl:attribute name="url">
            <xsl:value-of select="@href"/>
          </xsl:attribute>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:apply-templates select="node()" mode="content"/>
		</link>
	</xsl:template>
	
	<xsl:template match="insertElement">
    <u:insert select="{$path}" create-path="yes">
      <xsl:apply-templates select="../*[starts-with(name(.),'ns')]" mode="ns"/>
      <xsl:element name="{../content}" />
    </u:insert>
  </xsl:template>
  
  <xsl:template match="insertAttribute">
    <u:insert select="{$path}" create-path="yes">
      <xsl:apply-templates select="../*[starts-with(name(.),'ns')]" mode="ns"/>
      <u:attribute name="{../content}">-- value --</u:attribute>
    </u:insert>
  </xsl:template>
  
  <xsl:template match="insert">
    <u:insert select="{$path}" create-path="yes">
      <xsl:apply-templates select="../*[starts-with(name(.),'ns')]" mode="ns"/>
      <xsl:copy-of select="../content/node()"/>
    </u:insert>
  </xsl:template>
  
  <xsl:template match="update">
    <xsl:for-each select="../group[path]">
      <u:update select="{path}" create-path="yes">
        <xsl:apply-templates select="../*[starts-with(name(.),'ns')]" mode="ns"/>
      	<xsl:apply-templates select="content/node()" mode="content"/>
      </u:update>
    </xsl:for-each>
    <xsl:if test="not(../group[path])">
      <u:update select="{$path}" create-path="yes">
        <xsl:apply-templates select="../*[starts-with(name(.),'ns')]" mode="ns"/>
        <xsl:apply-templates select="../content/node()" mode="content"/>
      </u:update>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="delete">
    <u:delete select="." />
  </xsl:template>
  
  <xsl:template match="clone">
    <u:insert position="after" select=".">
      <u:copy-of select="preceding-sibling::*[1]"/>
    </u:insert>
  </xsl:template>
  
  <xsl:template match="rename">
    <xsl:for-each select="../group[path]">
      <u:rename select="{path}" name="{content}"/>
    </xsl:for-each>
    <xsl:if test="not(../group[path])">
      <u:rename select="{$path}" name="{../content}"/>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="*" mode="ns">
    <u:namespace prefix="{substring(name(),4)}" uri="{.}"/>
  </xsl:template>
  
  <xsl:template match="ns" mode="ns">
    <u:namespace uri="{.}"/>
  </xsl:template>
  
</xsl:stylesheet>
